WeatheData的data class建立好之後
就可以用retrofit準備api了
複習retrofit
AndroidManifest.xml加入
<uses-permission android:name="android.permission.INTERNET" />
dependencies加入
implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:converter-gson:2.3.0"
新增一個WeatherApiService.kt檔案
看一下我們之前拿到的request urlhttps://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=rdec-key-123-45678-011121314
如果像此範例app只有要拿這一個資料,也可以把整個url放在interface的@GET中
不過通常專案會有多樣api需求,所以還是用良好一些的做法
分析base網址應該是哪部分後,以const val宣告
private const val BASE_URL = "https://opendata.cwb.gov.tw/api/"
api有多種常見請求方式@GET,@POST,@PUT,@DELETE等等
目前還是練習基本的@GET
新增名爲WeatherApiService的interface
interface WeatherApiService {
@GET("v1/rest/datastore/F-C0032-001")
fun getWeather(
@Query("Authorization") key: String,
@Query("locationName") city: String? = null
): Call<WeatherData>
}
裡面只有一個getWeather()函數,回傳一個以WeatherData爲Type的Call object
其中有二個以@Query註解的參數key,city
就是呼叫getWeather()時
將授權碼(key),城市名(city)作爲引數傳進去,再與@GET,@Query的參數一起
合併爲完整可取得api的網址
準備好後,就可建立一個api Object
object WeatherApi {
private val retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BASE_URL)
.build()
val retrofitService: WeatherApiService = retrofit.create(WeatherApiService::class.java)
}
全部設定好之後,就可以準備發起請求
這邊直接寫在MainActivity的onCreate()中執行
WeatherApi
.retrofitService
.getWeather(key = "rdec-key-123-45678-011121314")
.enqueue(object : retrofit2.Callback<WeatherData> {
override fun onFailure(call: Call<WeatherData>, t: Throwable) {
Log.e("fail", t.message)
}
override fun onResponse(
call: Call<WeatherData>,
response: Response<WeatherData>
) {
//api response..
Log.d("success", response.toString())
if (response.isSuccessful) {
response.body()?.records?.location?.forEach {
Log.d("api", it.toString())
}
}
}
})
使用retrofitService呼叫getWeather,先傳入key
(因爲city宣告爲null,可選用,如果要用可傳入例如city="嘉義縣",這樣就只拿到嘉義縣的部分)
再呼叫.enqueue異步發起請求
並override onFailure,onResponse
二個函數要執行的動作
啓動app後,檢視logcat看是否成功取得資料